import pdb
import numpy as np
from subchannel_analysis_debug import SubchannelAnalysis
# 调试子通道分析
# 使用方法：python debug_subchannel.py
"""
子通道分析调试脚本使用手册

本脚本提供了一个交互式的调试环境，用于深入分析核反应堆子通道模型的各个关键步骤。

使用方法：
1. 直接运行脚本：python debug_subchannel.py
2. 在每个断点处，您可以：
   - 检查变量值
   - 执行交互式命令
   - 分析程序状态

主要调试断点：
1. 初始化参数检查
2. 质量和动量方程求解
3. 能量方程求解
4. 相变率计算
5. 横向流动分析
6. 壁面摩擦力计算

调试技巧：
- 使用 'n' 命令单步执行
- 使用 'p' 命令打印变量
- 使用 'c' 命令继续执行
- 使用 'q' 命令退出调试器

注意事项：
- 确保已安装所有依赖库
- 根据实际情况调整调试参数
- 建议在开发和优化模型时使用

作者：[李泉伯 2024-12-12]
"""

def debug_subchannel():
    # 使用 pdb.Pdb() 创建调试器实例
    debugger = pdb.Pdb()
    
    print("=== 开始子通道分析调试会话 ===")
    
    try:
        # 创建子通道分析器实例
        analyzer = SubchannelAnalysis(n_axial=2000)
        
        # 设置断点1：初始化后检查基本参数
        debugger.set_trace()
        print("\n检查初始化参数:")
        print(f"轴向节点数: {analyzer.n_axial}")
        print(f"子通道数量: {analyzer.n_channels}")
        print(f"通道长度: {analyzer.channel_length} m")
        print(f"入口压力: {analyzer.inlet_pressure} Pa")
        print(f"入口温度: {analyzer.inlet_temp} K")
        
        # 设置断点2：检查质量和动量方程求解
        debugger.set_trace()
        print("\n开始求解质量和动量方程")
        analyzer.solve_mass_momentum()
        
        # 设置断点3：检查能量方程求解
        debugger.set_trace()
        print("\n开始求解能量方程")
        analyzer.solve_energy_equations()
        
        # 设置断点4：检查相变率计算
        debugger.set_trace()
        print("\n检查相变率计算")
        for i in range(1, analyzer.n_axial, analyzer.n_axial//10):  # 每隔10%检查一次
            for j in range(analyzer.n_channels):
                gamma = analyzer.calculate_phase_change_rate(i, j)
                print(f"位置 {i}/{analyzer.n_axial}, 通道 {j+1}: gamma = {gamma:.4e}")
        
        # 设置断点5：检查横向流动
        debugger.set_trace()
        print("\n检查横向流动")
        for j in range(1, analyzer.n_channels + 1):
            for k in analyzer.channel_connections[j]:
                w = analyzer.calculate_cross_flow(analyzer.n_axial//2, j, k)
                print(f"通道 {j}-{k} 的横向流动: {w:.4e} kg/s")
        
        # 设置断点6：检查壁面摩擦力
        debugger.set_trace()
        print("\n检查壁面摩擦力")
        for phase in ['liquid', 'vapor']:
            f = analyzer.calculate_wall_friction(analyzer.n_axial//2, 0, phase)
            print(f"{phase}相壁面摩擦力: {f:.4e} N/m²")
        
        # 设置断点7：运行完整模拟
        debugger.set_trace()
        print("\n运行完整模拟")
        analyzer.run_simulation()
        
        # 设置断点8：检查结果
        debugger.set_trace()
        print("\n检查计算结果")
        print(f"最大空泡率: {np.max(analyzer.void_fraction):.4f}")
        print(f"最大液相速度: {np.max(analyzer.liquid_velocity):.4f} m/s")
        print(f"最大气相速度: {np.max(analyzer.vapor_velocity):.4f} m/s")
        print(f"出口压力: {np.mean(analyzer.pressure[-1,:]):.2e} Pa")
        print(f"出口温度: {np.mean(analyzer.temperature[-1,:]):.2f} K")
        
    except Exception as e:
        print(f"调试过程中出错: {str(e)}")
        import traceback
        traceback.print_exc()

def main():
    print("=== 子通道分析调试工具 ===")
    print("\n可用的pdb命令:")
    print("n(ext)      - 执行下一行")
    print("s(tep)      - 步入函数")
    print("r(eturn)    - 执行到函数返回")
    print("c(ontinue)  - 继续执行到下一个断点")
    print("p 变量名     - 打印变量值")
    print("pp 变量名    - 格式化打印变量值")
    print("l(ist)      - 显示当前位置的代码")
    print("w(here)     - 显示调用栈")
    print("q(uit)      - 退出调试器")
    print("\n特殊调试函数:")
    print("1. check_geometry() - 检查几何参数")
    print("2. check_fluid_properties() - 检查流体物性")
    print("3. check_convergence() - 检查收敛性")
    print("4. check_mass_balance() - 检查质量守恒")
    print("5. check_energy_balance() - 检查能量守恒")
    
    # 定义调试辅助函数
    def check_geometry(analyzer):
        """检查几何参数"""
        for j in range(1, analyzer.n_channels + 1):
            channel_type = analyzer.channel_types[j]
            geom = analyzer.channel_geometry[channel_type]
            print(f"\n子通道 {j} ({channel_type}):")
            print(f"流通面积: {geom['flow_area']:.6f} m²")
            print(f"湿长: {geom['wetted_perimeter']:.6f} m")
            print(f"加热周长: {geom['heated_perimeter']:.6f} m")
            
    def check_fluid_properties(analyzer):
        """检查流体物性"""
        p = analyzer.inlet_pressure
        t = analyzer.inlet_temp
        print("\n入口处流体物性:")
        props_l = analyzer.get_fluid_properties(p, t, 'liquid')
        props_v = analyzer.get_fluid_properties(p, t, 'vapor')
        print("\n液相物性:")
        for key, value in props_l.items():
            print(f"{key}: {value}")
        print("\n气相物性:")
        for key, value in props_v.items():
            print(f"{key}: {value}")
            
    def check_convergence(analyzer):
        """检查收敛性"""
        print("\n收敛性检查:")
        print(f"最大残差: {analyzer.calculate_residual():.4e}")
        
    def check_mass_balance(analyzer):
        """检查质量守恒"""
        print("\n质量守恒检查:")
        inlet_mass = 0
        outlet_mass = 0
        for j in range(analyzer.n_channels):
            # 入口质量流量
            rho_in = analyzer.get_fluid_properties(
                analyzer.pressure[0,j], 
                analyzer.temperature[0,j], 
                'liquid')['density']
            inlet_mass += rho_in * analyzer.liquid_velocity[0,j] * \
                         analyzer.channel_geometry[analyzer.channel_types[j+1]]['flow_area']
            
            # 出口质量流量
            rho_l = analyzer.get_fluid_properties(
                analyzer.pressure[-1,j],
                analyzer.temperature[-1,j],
                'liquid')['density']
            rho_v = analyzer.get_fluid_properties(
                analyzer.pressure[-1,j],
                analyzer.temperature[-1,j],
                'vapor')['density']
            
            area = analyzer.channel_geometry[analyzer.channel_types[j+1]]['flow_area']
            outlet_mass += (rho_l * (1-analyzer.void_fraction[-1,j]) * \
                          analyzer.liquid_velocity[-1,j] + \
                          rho_v * analyzer.void_fraction[-1,j] * \
                          analyzer.vapor_velocity[-1,j]) * area
            
        print(f"入口质量流量: {inlet_mass:.4f} kg/s")
        print(f"出口质量流量: {outlet_mass:.4f} kg/s")
        print(f"相对误差: {abs(inlet_mass-outlet_mass)/inlet_mass*100:.4f}%")
        
    def check_energy_balance(analyzer):
        """检查能量守恒"""
        print("\n能量守恒检查:")
        # 入口能量
        inlet_energy = 0
        outlet_energy = 0
        total_heat = 0
        
        for j in range(analyzer.n_channels):
            # 入口能量
            props = analyzer.get_fluid_properties(
                analyzer.pressure[0,j],
                analyzer.temperature[0,j],
                'liquid')
            inlet_energy += props['enthalpy'] * \
                           analyzer.liquid_velocity[0,j] * \
                           props['density'] * \
                           analyzer.channel_geometry[analyzer.channel_types[j+1]]['flow_area']
            
            # 出口能量
            props_l = analyzer.get_fluid_properties(
                analyzer.pressure[-1,j],
                analyzer.temperature[-1,j],
                'liquid')
            props_v = analyzer.get_fluid_properties(
                analyzer.pressure[-1,j],
                analyzer.temperature[-1,j],
                'vapor')
            
            area = analyzer.channel_geometry[analyzer.channel_types[j+1]]['flow_area']
            outlet_energy += (props_l['enthalpy'] * (1-analyzer.void_fraction[-1,j]) * \
                            analyzer.liquid_velocity[-1,j] * props_l['density'] + \
                            props_v['enthalpy'] * analyzer.void_fraction[-1,j] * \
                            analyzer.vapor_velocity[-1,j] * props_v['density']) * area
            
            # 加热量
            for i in range(analyzer.n_axial):
                total_heat += (analyzer.q_wl[i,j] + analyzer.q_wv[i,j]) * \
                             analyzer.dz * \
                             analyzer.channel_geometry[analyzer.channel_types[j+1]]['heated_perimeter']
                
        print(f"入口能量流率: {inlet_energy:.4e} W")
        print(f"出口能量流率: {outlet_energy:.4e} W")
        print(f"总加热量: {total_heat:.4e} W")
        print(f"能量平衡误差: {abs(outlet_energy-inlet_energy-total_heat)/total_heat*100:.4f}%")
    
    # 将辅助函数添加到调试器的命名空间
    debugger = pdb.Pdb()
    debugger.check_geometry = check_geometry
    debugger.check_fluid_properties = check_fluid_properties
    debugger.check_convergence = check_convergence
    debugger.check_mass_balance = check_mass_balance
    debugger.check_energy_balance = check_energy_balance
    
    # 开始调试会话
    debug_subchannel()

if __name__ == '__main__':
    main() 